Proxmox VE 网络配置 NAT共享IP 端口映射iptables、brook |
您所在的位置:网站首页 › proxmox 网络规划 › Proxmox VE 网络配置 NAT共享IP 端口映射iptables、brook |
PVE网络配置官方文档:跳转
配置桥接网卡,使Proxmox VE(PVE)可以同时创建NAT虚拟机和独立IP虚拟机,同时可以使用脚本映射NAT虚拟机的端口到外网。 1、开启ipv4、ipv6转发 vim /etc/sysctl.conf文件最后加入如下配置 net.ipv4.ip_forward=1 net.ipv4.conf.all.rp_filter=1 net.ipv4.icmp_echo_ignore_broadcasts=1 net.ipv4.conf.default.forwarding=1 net.ipv4.conf.default.proxy_arp = 0 net.ipv4.conf.default.send_redirects = 1 net.ipv4.conf.all.send_redirects = 0 net.ipv6.conf.eno1.autoconf=0 net.ipv6.conf.eno1.accept_ra=2 net.ipv6.conf.default.forwarding=1 net.ipv6.conf.all.forwarding=1 net.ipv6.conf.default.proxy_ndp=1 net.ipv6.conf.all.proxy_ndp=1 2、 配置Proxmox VE网卡文件信息 vim /etc/network/interfaces新增一个vmbr172网桥,并设置流量转发 auto lo iface lo inet loopback iface enp40 inet manual auto vmbr0 iface vmbr0 inet static address 192.168.0.103/24 gateway 192.168.0.1 bridge-ports enp40 bridge-stp off bridge-fd 0 #物理网卡配置一般不做改动,系统模板都是配置好的。 #为虚拟机新建一个虚拟网桥 #内网地址,虚拟机的网关 auto vmbr172 iface vmbr172 inet static address 172.16.1.1 netmask 255.255.255.0 bridge-ports none bridge-stp off bridge-fd 0 post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up echo 1 > /proc/sys/net/ipv4/conf/eno1/proxy_arp #转发IPv4流量到虚拟机,使虚拟机与外网联通。 post-up iptables -t nat -A POSTROUTING -s '172.16.1.0/16' -o vmbr0 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s '172.16.1.0/16' -o vmbr0 -j MASQUERADE重启 sudo service networking restart 3、 搭建DHCP服务器此处使用的是ubuntu做dhcp服务器 参考地址 4、 内外网端口映射转发 #新增 iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10022 -j DNAT --to-destination 10.10.10.100:22 #删除 (即把新增映射的-A改成-D) iptables -t nat -D PREROUTING -p tcp -m tcp --dport 10022 -j DNAT --to-destination 10.10.10.100:22 #查看NAT规则,并显示行号 iptables -t nat --list --line-number #删除指定行号的iptables规则 iptables -t nat -D POSTROUTING 10IPv4是经过内网转发的,所以现在只可以访问外网,而外网却无法访问虚拟机。所以我们需要配置端口转发,将外部的访问转发到虚拟机。一般的做法是通过iptables进行转发。 4.1 使用ufwLInux原始的防火墙工具iptables由于过于繁琐,所以ubuntu系统默认提供了一个基于iptable之上的防火墙工具ufw。而UFW支持图形界面操作,只需在命令行运行ufw命令即能看到一系列的操作 UFW 全称为Uncomplicated Firewall,是Ubuntu 系统上默认的防火墙组件, 为了轻量化配置iptables 而开发的一款工具。 UFW 提供一个非常友好的界面用于创建基于IPV4,IPV6的防火墙规则。 Linux 2.4内核以后提供了一个非常优秀的防火墙工具:netfilter/iptables,他免费且功能强大,可以对流入、流出的信息进行细化控制,它可以 实现防火墙、NAT(网络地址翻译)和数据包的分割等功能。netfilter工作在内核内部,而iptables则是让用户定义规则集的表结构。 但是iptables的规则稍微有些“复杂”,因此ubuntu提供了ufw这个设定工具,以简化iptables的某些设定,其后台仍然是 iptables。ufw 即uncomplicated firewall的简称, 参考地址 4.2 使用iptables端口映射可以使用iptables来完整,已经有大佬写了方便的脚本; 脚本名称 iptables.sh #! /bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH #ConfFile iptablesconf='/root/iptables.config.sh' function rootness(){ if [[ $EUID -ne 0 ]]; then echo "脚本需要以ROOT权限运行!" exit 1 fi } function conf_list(){ cat $iptablesconf } function conf_add(){ if [ ! -f $iptablesconf ];then echo "找不到配置文件!" exit 1 fi echo "请输入虚拟机的内网IP" read -p "(Default: Exit):" confvmip [ -z "$confvmip" ] && exit 1 echo echo "虚拟机内网IP = $confvmip" echo while true do echo "请输入虚拟机的端口:" read -p "(默认端口: 22):" confvmport [ -z "$confvmport" ] && confvmport="22" expr $confvmport + 0 &>/dev/null if [ $? -eq 0 ]; then if [ $confvmport -ge 1 ] && [ $confvmport -le 65535 ]; then echo echo "虚拟机端口 = $confvmport" echo break else echo "输入错误,端口范围应为1-65535!" fi else echo "输入错误,端口范围应为1-65535!" fi done echo while true do echo "请输入宿主机的端口" read -p "(默认端口: 8899):" natconfport [ -z "$natconfport" ] && natconfport="8899" expr $natconfport + 0 &>/dev/null if [ $? -eq 0 ]; then if [ $natconfport -ge 1 ] && [ $natconfport -le 65535 ]; then echo echo "宿主机端口 = $natconfport" echo break else echo "输入错误,端口范围应为1-65535!" fi else echo "输入错误,端口范围应为1-65535!" fi done echo "请输入转发协议:" read -p "(tcp 或者 udp ,回车默认操作: 退出):" conftype [ -z "$conftype" ] && exit 1 echo echo "协议类型 = $conftype" echo iptablesshell="iptables -t nat -A PREROUTING -i vmbr0 -p $conftype --dport $natconfport -j DNAT --to-destination $confvmip:$confvmport" if [ `grep -c "$iptablesshell" $iptablesconf` != '0' ]; then echo "配置已经存在" exit 1 fi get_char(){ SAVEDSTTY=`stty -g` stty -echo stty cbreak dd if=/dev/tty bs=1 count=1 2> /dev/null stty -raw stty echo stty $SAVEDSTTY } echo echo "回车继续,Ctrl+C退出脚本" char=`get_char` echo $iptablesshell >> $iptablesconf runreturn=`$iptablesshell` echo $runreturn echo '配置添加成功' } function add_confs(){ rootness conf_add } function del_conf(){ echo while true do echo "请输入宿主机的端口" read -p "(默认操作: 退出):" confserverport [ -z "$confserverport" ] && exit 1 expr $confserverport + 0 &>/dev/null if [ $? -eq 0 ]; then if [ $confserverport -ge 1 ] && [ $confserverport -le 65535 ]; then echo echo "宿主机端口 = $confserverport" echo break else echo "输入错误,端口范围应为1-65535!" fi else echo "输入错误,端口范围应为1-65535!" fi done echo iptablesshelldel=`cat $iptablesconf | grep "dport $confserverport"` if [ ! -n "$iptablesshelldel" ]; then echo "配置文件中没有该宿主机的端口" exit 1 fi iptablesshelldelshell=`echo ${iptablesshelldel//-A/-D}` runreturn=`$iptablesshelldelshell` echo $runreturn sed -i "/$iptablesshelldel/d" $iptablesconf echo '配置删除成功' } function del_confs(){ printf "你确定要删除配置吗?操作是不可逆的(y/n) " printf "\n" read -p "(默认: n):" answer if [ -z $answer ]; then answer="n" fi if [ "$answer" = "y" ]; then rootness del_conf else echo "配置删除操作取消" fi } action=$1 case "$action" in add) add_confs ;; list) conf_list ;; del) del_confs ;; *) echo "参数错误! [${action} ]" echo "用法: `basename $0` {add|list|del}" ;; esac脚本配置文件 名称 iptables.config.sh #!/usr/bin/env bash上传iptables.sh和iptables.config.sh 脚本到宿主机root目录,或者直接在root目录下创建 赋予iptables.config.sh可执行权限 xxx自行更改,为配置文件的路径 chmod +x /xxx/iptables.config.sh在 iptables.sh目录下执行一下命令根据提示进行添加或删除端口映射 #添加端口映射 bash iptables.sh add #删除端口映射 bash iptables.sh del 4.3 使用brook 进行统一控制这样,访问服务器10022端口就会自动转发到虚拟机10.10.10.100的22端口上,实现了外网通过ssh登陆虚拟机的目的。但是,这样做有一个问题,ProxmoxVE自带防火墙,iptables开放22端口,相当于在防火墙上面开了一个洞,而且这个洞不受防火墙的控制,如果需要做安全防护,你还需要单独配置iptables,不是很方便。于是想到一个折中办法,用brook做端口转发,同时利用ProxmoxVE的防火墙进行统一控制。 获取brook,项目地址 #version 版本 wget -O /root/brook https://github.com/txthinking/brook/releases/download/{version}/brook/brook_linux_xxx wget -O /root/brook https://github.com/txthinking/brook/releases/download/v20221212/brook_linux_amd64将brook移动到你想要放的地方 赋予执行权限 brook路径 需要自行修改 chmod +x /brook路径/brook启动端口转发 from 宿主机端口。to 虚拟机的ip+端口 #前台运行退出终端及结束转发 nohup /root/brook relay --from :10022 --to 10.10.10.100:22 #设置为后台运行 nohup /root/brook relay --from :10022 --to 10.10.10.100:22 > output 2>&1 &
创建brookforward.sh vim /root/brookforward.sh写入以下命令 #! /bin/sh nohup /root/brook relay --from :10022 --to 10.10.10.100:22 > output 2>&1赋予brookforward.sh执行权限 chmod +x brookforward.sh!!! 注意若要使用systemD 将brookforward.sh实现开机自启动,以及服务自启。在.sh文件中nohup命令不能在最后加上&,让nohup命令保持后台运行,加上了该brookforward.service将会启动失败。 创建 SystemD service 配文件 vim /etc/systemd/system/brookforward.service写入以下信息 # /etc/systemd/system/brookforward.service [Unit] Description=brookforward After=syslog.target After=network.target [Service] Type=simple ExecStart=/root/brookforward.sh Restart=always RestartSec=5 [Install] WantedBy=multi-user.targetReload SystemD 以加载新的配置文件: systemctl daemon-reload启动 brookforward 服务并设置开机自启: systemctl enable --now brookforward查看运行状态: systemctl status brookforward这样,一个同时开启了NAT和IPv6的虚拟机就创建好了,但是,还有个问题,IPv6的配置和端口转发是会随着主机重启而失效,我们需要在主机上启动开机自启服务,保证每次开机的时候,虚拟机器都能正常工作。 需要在PVE中开启开机自启服务,创建/etc/rc.local。 #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. exit 0赋予执行权限 chmod +x /etc/rc.local启动服务 systemctl start rc-local这样,我们只需要将需要执行的命令写在/etc/rc.local的exit 0前面,就可以在开机后自动执行。 参考Proxmox VE同时配置NAT共享IP和独立IP虚拟机 PVE服务器网络配置 单IP服务器利用ProxmoxVE建立IPv4-NAT和IPv6虚拟机 brook安装使用参考 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |